
package com.xtsoft.platform.task.service;

import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;

import javax.transaction.Transactional;

import com.xtsoft.platform.base.system.domain.SysOrganize;
import com.xtsoft.platform.base.system.domain.SysUser;

import com.xtsoft.platform.task.domain.InfTask;
import com.xtsoft.platform.task.domain.TaskCalend;
import com.xtsoft.platform.task.repository.InfTaskRepository;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.MultiValueMap;

import com.xtsoft.core.repository.QueryFilter;

/*
*    上海信拓信息技术有限公司 Koala企业综合信息管理系统
*    Copyright (C) 2010-2013 ShangHai XinTuo Software Inc.
*/

import com.xtsoft.core.service.GenericService;
import com.xtsoft.core.utils.ResultMsg;
import com.xtsoft.core.utils.tree.CommonTreeNode;



public interface InfTaskService extends GenericService<InfTask,String, InfTaskRepository>{
	public SysOrganize sysOrganize();

	public List<CommonTreeNode> getAllInfTaskTree() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException;



	/**
	 * 
	 * <p> 获取项目任务树  </p>  
	 * @return
	 * @return List<CommonTreeNode>
	 * @throws IntrospectionException 
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws  
	 * @author litao
	 * @date 2020年8月19日 
	 * @time 下午1:51:57
	 */
	public List<CommonTreeNode> getAllTree(boolean needRootNode,SysUser user) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException;	
	/**
	 * 
	 * <p> 根据父节点查询所有的子节点  </p>  
	 * @param parentNodeId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2020年8月21日 
	 * @time 上午11:10:12
	 */
	public List<InfTask> findByParentNodeId(String parentNodeId);
	
	/**
	 * 
	 * <p> 根据节点查询任务或者项目  </p>  
	 * @param nodeId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2020年8月27日 
	 * @time 上午9:59:53
	 */
	public List<InfTask> findByNodeId(String nodeId);
	/**
	 * 
	 * <p> 修改infTask的编辑时间，编辑人，以及状态  </p>  
	 * @param infTask
	 * @return void
	 * @throws  
	 * @author litao
	 * @date 2020年8月31日 
	 * @time 上午10:13:13
	 */
	public void updateStateAndDate(InfTask infTask, SysUser sysUser);
	/**
	 * 
	 * <p> 获取任务数量  </p>  
	 * @param userId
	 * @return
	 * @return Map<String,Object>
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 上午9:51:18
	 */
	public Map<String, Object> getInfTaskCount(String userId);
	/**
	 * 
	 * <p> 获取当天的任务  </p>  
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 下午3:54:51
	 */
	public List<InfTask> findInfTaskDayByPlanDate(String userId);
	/**
	 * 
	 * <p> 获取本月的任务信息  </p>  
	 * @param userId
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年1月4日 
	 * @time 下午4:06:14
	 */
	public List<InfTask> findInfTaskMonthByPlanDate(String userId);
	/**
	 * 
	 * <p> 添加infTask  </p>  
	 * @param infTask
	 * @param user
	 * @return void
	 * @throws  
	 * @author litao
	 * @date 2021年4月21日 
	 * @time 下午4:06:06
	 */
	public ResultMsg addTask(InfTask infTask,SysUser user);
	
	public List<InfTask> userConvert(List<InfTask> list);
	
//	public List<InfTask> getAllInfTaskByTaskComment(HttpServletRequest request);
	/**
	 * 
	 * <p> 根据任务ID获取没有任务点评的任务  </p>  
	 * @param taskId
	 * @return
	 * @return InfTask
	 * @throws  
	 * @author litao
	 * @date 2021年4月25日 
	 * @time 上午10:31:36
	 */
	public List<InfTask> getInfTaskByComment(String taskId);
	/**
	 * 
	 * <p>获取任务  </p>  
	 * @return
	 * @return List<InfTask>
	 * @throws  
	 * @author litao
	 * @date 2021年4月27日 
	 * @time 下午1:25:28
	 */
	public List<InfTask> findInfTaskByisProject(int isProject);
	
	public Map<String,List<TaskCalend>> findTaskByUserId(String userId);
	
	public String TaskTree(HttpServletRequest request, boolean isRight, String userId);
	/**
	 * 
	 * <p> 设置任务为完成态  </p>  
	 * @param infTask
	 * @return void
	 * @throws  
	 * @author defencez  
	 * @date 2022年3月4日 
	 * @time 下午1:03:48
	 */
	public void perform(InfTask infTask);
	
	public Map<String,List<TaskCalend>> findTaskByUserIdTwo();
	
	/**
	 * 
	 * <p>编辑任务或者项目  </p>  
	 * @param infTask
	 * @param user
	 * @return
	 * @return ResultMsg
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws  
	 * @author litao
	 * @date 2021年5月19日 
	 * @time 下午3:13:40
	 */
	@Transactional
	public ResultMsg editTask(InfTask infTask,SysUser user) throws IllegalAccessException, InvocationTargetException;
	/**
	 * 
	 * <p> 获取项目树只有项目  </p>  
	 * @param b
	 * @return
	 * @return List<CommonTreeNode>
	 * @throws  
	 * @author litao
	 * @date 2021年5月20日 
	 * @time 上午10:20:07
	 */
	public List<CommonTreeNode> getAllTaskTree(boolean b)throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException;

	/**
	 * 
	 * <p>获取中文编码的descript  </p>  
	 * @param Id
	 * @return
	 * @return String
	 * @throws  
	 * @author litao
	 * @date 2021年5月21日 
	 * @time 上午10:19:58
	 */
	public String findDescriptById(String Id);
	/**
	 * 
	 * <p> 根据父级ID查询最大的排序  </p>  
	 * @param parentNodeId
	 * @return
	 * @return int
	 * @throws  
	 * @author litao
	 * @date 2021年5月24日 
	 * @time 上午9:37:14
	 */
	public int findMaxRecordSortByParentNodeId(String parentNodeId);
	
	/**
	 * 
	 * <p> 获取当前月份的项目  </p>  
	 * @param filter
	 * @return void
	 * @throws  
	 * @author litao
	 * @date 2021年9月28日 
	 * @time 上午10:41:55
	 */
	public void getMonth(QueryFilter<InfTask> filter);
	
	//获取今日的任务
	public void getDay(QueryFilter<InfTask> filter);
	
	/**
	 * 
	 * <p> 获取本月未完成的项目  </p>  
	 * @param filter
	 * @return void
	 * @throws  
	 * @author litao
	 * @date 2021年9月28日 
	 * @time 上午11:09:25
	 */
	public void getIncomplete(QueryFilter<InfTask> filter);
	
	public Map<String, List<Map<String, Object>>> getProjectCount();
	/**
	 * 
	 * <p> 判断用户是否是项目责任人  </p>  
	 * @param user
	 * @param task
	 * @return
	 * @return boolean
	 * @throws  
	 * @author defencez  
	 * @date 2022年3月4日 
	 * @time 下午12:51:32
	 */
	public boolean isDuty(SysUser user, InfTask task);

	
}



